package src.serveur;

import src.ihm.FenetreConnexion;

import java.io.IOException;
import java.io.PrintWriter;
import src.client.*;

import java.net.Inet4Address;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Vector;

import src.bdd.ConnectionBDD;

public class Serveur {
	

	// contiendra tous les flux de sortie vers les clients
	private Vector _tabClients = new Vector(); 
	// nombre total de clients connectés
	private int _nbClients=0; 
	//tableau des email des utilisateurs connectés
	private ArrayList<Client> clients=new ArrayList<Client>();
	

	
	  
	  public void Serveur()
	  {
	  }
	  
	//** Methode : la première méthode exécutée, elle attend les connections **
	  public void seConnecter() throws IOException
	  {
	      Integer port=new Integer(18888);
		  ServerSocket ss = new ServerSocket(port);
	      while (true) // attente en boucle de connexion (bloquant sur ss.accept)
	      {
	        new ThreadClient(ss.accept(),this); // un client se connecte, un nouveau thread client est lancé
	      }
	  }



	  //** Methode : envoie le message à tous les clients **
	  synchronized public void sendAll(String message,String sLast)
	  {
		// declaration d'une variable permettant l'envoi de texte vers le client
	    PrintWriter out; 
	    for (int i = 0; i < _tabClients.size(); i++) // parcours de la table des connectés
	    {
	    	 // extraction de l'élément courant (type PrintWriter)
	      out = (PrintWriter) _tabClients.elementAt(i);
	      if (out != null) // sécurité, l'élément ne doit pas être vide
	      {
	      	// ecriture du texte passé en paramètre (et concaténation d'une string de fin de chaine si besoin)
	        System.out.print(message+sLast);
	        out.flush(); // envoi dans le flux de sortie
	      }
	    }
	  }
	  
	  //** Methode : envoie le message à tous les clients **
	  synchronized public void envoieClient(String message,String sLast)
	  {
		// declaration d'une variable permettant l'envoi de texte vers le client
	    PrintWriter out; 
	    for (int i = 0; i < _tabClients.size(); i++) // parcours de la table des connectés
	    {
	    	 // extraction de l'élément courant (type PrintWriter)
	      out = (PrintWriter) _tabClients.elementAt(i);
	      if (out != null) // sécurité, l'élément ne doit pas être vide
	      {
	      	// ecriture du texte passé en paramètre (et concaténation d'une string de fin de chaine si besoin)
	        System.out.print(message+sLast);
	        out.flush(); // envoi dans le flux de sortie
	      }
	    }
	  }

	  
	  synchronized public int verifConnection(String identifiant,String motDePasse) throws SQLException
	  {
		  //connexion à la base de donnée pour vérifier les identifiants
			ConnectionBDD conn=new ConnectionBDD();
			conn.seConnecter();
			String requete="select * from Utilisateur;";
			
				conn.setRs(conn.getStmt().executeQuery(requete));

				while(conn.getRs().next())
				{
					if(conn.getRs().getString("email").compareTo(identifiant)==0)
					{
						if(conn.getRs().getString("mot_de_passe").compareTo(motDePasse)==0)
						{
							//lancement de la connection sur le serveur
							System.out.println("Authentification réussie");
							return 1;
						}
					}
				}
				return 0;
			
			
	  }
	  

	  //** Methode : détruit le client no i **
	  synchronized public void delClient(Client cl)
	  {
	    _nbClients--; // un client en moins ! snif
	    int i=0;
	    while(clients.get(i).getEmail()!=cl.getEmail())
	    {
	    	i++;
	    }
	    if(clients.get(i)!=null)
	    {
	    	clients.remove(i);
	    }
	  }

	  //** Methode : ajoute un nouveau client dans la liste **
	  synchronized public void addClient(Client cl)
	  {
	    _nbClients++; // un client en plus ! ouaaaih
	    clients.add(cl); // on ajoute le nouveau flux de sortie au tableau
	  }
	  
	  //** Methode : affiche la liste des clients connectés **
	  synchronized public void afficheClients()
	  {
		  int i=0;
		  while(i!=clients.size())
		  {
			  System.out.println(clients.get(i).getEmail());
			  i++;
		  }
	  }

	  //** Methode : retourne le nombre de clients connectés **
	  synchronized public int getNbClients()
	  {
	    return _nbClients; // retourne le nombre de clients connectés
	  }

	  public static void main(String[] args) {
			
			Serveur serv=new Serveur();
			try {
				serv.seConnecter();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}

}
